function Set(arr = []) {
  let items = {};
  this.size = 0;
  // has方法
  this.has = function(val) {
    return items.hasOwnProperty(val);
  };
  // add方法
  this.add = function(val) {
    // 如果没有存在items里面就可以直接写入
    if (!this.has(val)) {
      items[val] = val;
      this.size++;
      return true;
    }
    return false;
  };
  arr.forEach((val, i) => {
    this.add(val);
  });
  // delete方法
  this.delete = function(val) {
    if (this.has(val)) {
      delete items[val]; // 将items对象上的属性删掉
      this.size--;
      return true;
    }
    return false;
  };
  // clear方法
  this.clear = function() {
    items = {};
    this.size = 0;
  };
  // keys方法
  this.keys = function() {
    return Object.keys(items);
  };
  // values方法
  this.values = function() {
    return Object.values(items);
  };
  // forEach方法
  this.forEach = function(fn, context = this) {
    for (let i = 0; i < this.size; i++) {
      let item = Object.keys(items)[i];
      fn.call(context, item, item, items);
    }
  };
}
